package myzzyl.service.Impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.swagger.v3.oas.models.security.SecurityScheme;
import myzzyl.constants.CommonStatus;
import myzzyl.constants.ErrorConstants;
import myzzyl.domain.dto.SysPostDto;
import myzzyl.domain.dto.SysPostPageQueryDto;
import myzzyl.domain.pojo.SysDept;
import myzzyl.domain.pojo.SysPost;
import myzzyl.domain.pojo.SysUser;
import myzzyl.domain.vo.SysPostVo;
import myzzyl.exception.BusinessException;
import myzzyl.response.PageResponse;
import myzzyl.service.SysDeptService;
import myzzyl.service.SysPostService;
import myzzyl.mapper.SysPostMapper;
import myzzyl.service.SysUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
* @author 33249
* @description 针对表【sys_post(岗位表)】的数据库操作Service实现
* @createDate 2025-08-14 10:03:44
*/
@Service
public class SysPostServiceImpl extends ServiceImpl<SysPostMapper, SysPost>
    implements SysPostService {

    @Autowired
    private SysDeptService sysDeptService;

    @Autowired
    private SysUserService sysUserService;

    /**
     * 获取职位列表数据
     * @param pageNum 页面
     * @param pageSize 每页大小
     * @param sysPostPageQueryDto 职位分页查询请求包装类
     * @return 返回值
     */
    @Override
    public PageResponse<SysPostVo> pageQuery(Integer pageNum, Integer pageSize,
                                               SysPostPageQueryDto sysPostPageQueryDto) {
        // 创建分页对象
        Page<SysPost> page = new Page<>(pageNum, pageSize);

        // 添加排序字段
        page.addOrder(OrderItem.asc("sort_no"), OrderItem.desc("create_time"));

        // 分页查询
        IPage<SysPostVo> postVoIPage = baseMapper.selectSysPostVo(page, sysPostPageQueryDto);

        // 构造基本分页响应对象返回
        return new PageResponse<>(postVoIPage.getPages(), postVoIPage.getTotal(), postVoIPage.getRecords());
    }


    /**
     * 获取所有职位数据
     * @param sysPostDto 职位表单请求封装类
     * @return 返回值
     */
    @Override
    public List<SysPost> getAll(SysPostDto sysPostDto) {
        return lambdaQuery()
                .eq(StrUtil.isNotBlank(sysPostDto.getDeptNo()), SysPost::getDeptNo, sysPostDto.getDeptNo())
                .list();
    }

    /**
     * 获取职位详情数据
     * @param id 职位id
     * @return 返回值
     */
    @Override
    public SysPost getInfo(Long id) {
        SysPost sysPost = getById(id);
        if(sysPost == null) {
            throw new BusinessException(ErrorConstants.POST_IS_NOT_EXIST);
        }

        return sysPost;
    }


    /**
     * 新增职位
     * @param sysPostDto 职位表单请求封装类
     * @return 返回值
     */
    @Override
    public boolean add(SysPostDto sysPostDto) {
        // 判断职位名称是否为空
        if (StrUtil.isBlank(sysPostDto.getPostName())) {
            throw new BusinessException(ErrorConstants.POST_NAME_IS_NULL);
        }

        // 查询部门是否存在
        SysDept sysDept = sysDeptService.lambdaQuery().eq(SysDept::getDeptNo, sysPostDto.getDeptNo()).one();
        if (sysDept == null) {
            throw new BusinessException(ErrorConstants.DEPT_IS_NOT_EXIST);
        }
        // 查询职位是否已经存在（同级下）
        if (lambdaQuery().eq(SysPost::getPostName, sysPostDto.getPostName())
                         .eq(SysPost::getDeptNo, sysPostDto.getDeptNo()).exists()) {
            throw new BusinessException(ErrorConstants.POST_IS_ALREADY_EXIST);
        }

        // 查询部门下的最大职位
        SysPost maxPost = lambdaQuery()
                .select(SysPost::getPostNo)
                .eq(SysPost::getDeptNo, sysPostDto.getDeptNo())
                .orderByDesc(SysPost::getPostNo)
                .last("limit 1")
                .one();

        // 构造职位编号，部门id + .01 弱化职位显示
        String newPostNo = null;

        if (maxPost == null) {
            newPostNo = sysDept.getId() + ".01";
        }else {
            String maxPostNo = maxPost.getPostNo();
            String suffix = maxPostNo.substring(maxPostNo.lastIndexOf(".") + 1);
            int maxNum = Integer.parseInt(suffix) + 1;
            newPostNo = sysDept.getId() + "." + String.format("%02d", maxNum);
        }

        // 新增SysPost项目
        SysPost sysPost = new SysPost();
        BeanUtils.copyProperties(sysPostDto, sysPost);
        sysPost.setPostNo(newPostNo);
        sysPost.setDataState("0");

        return save(sysPost);
    }


    /**
     * 编辑职位
     * @param sysPostDto 职位表单请求封装类
     * @return 返回值
     */
    @Override
    @Transactional
    public boolean edit(SysPostDto sysPostDto) {
        // 判断职位名称是否为空
        if (StrUtil.isBlank(sysPostDto.getPostName())) {
            throw new BusinessException(ErrorConstants.POST_NAME_IS_NULL);
        }

        // 查询部门是否存在
        SysDept sysDept = sysDeptService.lambdaQuery().eq(SysDept::getDeptNo, sysPostDto.getDeptNo()).one();
        if (sysDept == null) {
            throw new BusinessException(ErrorConstants.DEPT_IS_NOT_EXIST);
        }
        // 查询职位是否已经存在（同级下，除去自己）
        if (lambdaQuery().eq(SysPost::getPostName, sysPostDto.getPostName())
                .eq(SysPost::getDeptNo, sysPostDto.getDeptNo())
                .ne(SysPost::getId, sysPostDto.getId()).exists()) {
            throw new BusinessException(ErrorConstants.POST_IS_ALREADY_EXIST);
        }

        // 查询职位，看部门编号是否发生变化
        SysPost post = getById(sysPostDto.getId());
        if (post == null) {
            throw new BusinessException(ErrorConstants.POST_IS_NOT_EXIST);
        }

        // 职位关联了用户，不能禁用
        if (sysUserService.lambdaQuery().eq(SysUser::getPostNo, post.getPostNo()).exists()) {
            throw new BusinessException(ErrorConstants.POST_HAS_USER);
        }

        // 定义要更新的编号
        String newPostNo = post.getPostNo();

        if (!post.getDeptNo().equals(sysPostDto.getDeptNo())) {
            // 查询部门下的最大职位
            SysPost maxPost = lambdaQuery()
                    .select(SysPost::getPostNo)
                    .eq(SysPost::getDeptNo, sysPostDto.getDeptNo())
                    .orderByDesc(SysPost::getPostNo)
                    .last("limit 1")
                    .one();

            // 构造职位编号，部门id + .01 弱化职位显示
            if (maxPost == null) {
                newPostNo = sysDept.getId() + ".01";
            }else {
                String maxPostNo = maxPost.getPostNo();
                String suffix = maxPostNo.substring(maxPostNo.lastIndexOf(".") + 1);
                int maxNum = Integer.parseInt(suffix) + 1;
                newPostNo = sysDept.getId() + "." + String.format("%02d", maxNum);
            }
        }

        // 更新SysPost
        return lambdaUpdate()
                .set(SysPost::getDeptNo, sysPostDto.getDeptNo())
                .set(SysPost::getPostNo, newPostNo)
                .set(SysPost::getPostName, sysPostDto.getPostName())
                .set(SysPost::getRemark, sysPostDto.getRemark())
                .eq(SysPost::getId, sysPostDto.getId())
                .update();
    }


    /**
     * 删除职位
     * @param postNo 职位编号
     * @return 返回值
     */
    @Override
    public boolean remove(String postNo) {
        // 查询职位是否存在
        SysPost post = lambdaQuery().eq(SysPost::getPostNo, postNo).one();
        if (post == null) {
            throw new BusinessException(ErrorConstants.POST_IS_NOT_EXIST);
        }

        // 判断是否为启用状态
        if (post.getDataState().equals("0")) {
            throw new BusinessException(ErrorConstants.POST_IS_ACTIVE);
        }

        // 删除SysPost
        return baseMapper.deleteById(post.getId()) > 0;
    }

    /**
     * 启用或禁用职位
     * @param sysPostDto 职位表单请求封装类
     * @return 返回值
     */
    @Override
    public boolean enableOrDisableSysPost(SysPostDto sysPostDto) {
        // 查询职位是否存在
        SysPost post = getById(sysPostDto.getId());
        if (post == null) {
            throw new BusinessException(ErrorConstants.POST_IS_NOT_EXIST);
        }

        // 判断修改的状态是否为空
        if (StrUtil.isBlank(sysPostDto.getDataState())) {
            throw new BusinessException(ErrorConstants.POST_STATUS_IS_NULL);
        }

        // 判断是否为禁用状态
        if (sysPostDto.getDataState().equals("1")) {
            // 职位关联了用户，不能禁用
            if (sysUserService.lambdaQuery().eq(SysUser::getPostNo, post.getPostNo()).exists()) {
                throw new BusinessException(ErrorConstants.POST_HAS_USER);
            }
        }

        return lambdaUpdate()
                .set(SysPost::getDataState, sysPostDto.getDataState())
                .eq(SysPost::getId, sysPostDto.getId())
                .update();
    }


}
